package cn.tedu.api;
/*本类用于测试String类的使用*/
public class TestString {

    char[] value = {'a','b','c'};
    String s1 = new String(value);



    public static void main(String[] args) {

//        char[] value = {'a','b','c'};
        //value = {'d','e','f'}; //数组一经创建长度固定,不允许更改


//        String s1 = new String(value);
//        s1 = "def";



        int i = 2;
        i = 3;

        boolean b = false;
        b = true;

        double d = 3d;
        d = 5d;

        //1.创建String的方式1
        /*1.字符串类型底层维护的是char[]*/
        char[] value = {'a','b','c'};
        String s1 = new String(value);//触发String(char[])的含参构造来创建对象
        String s11 = new String(value);//触发String(char[])的含参构造来创建对象
        //String s11 = "abc";

        //2.创建String的方式2
        String s2 = "abc";
        String s22 = "abc";
        String s3 = "ccc";
        //3.测试
        System.out.println(s1 == s2);//false,一个在堆里(变量再栈里,对象值在堆里)，一个在常量池里
        System.out.println(s1 == s11);//false,两个不同的对象,地址值不同
        System.out.println(s2 == s22);//true,都在堆中常量池,并且由于内容相同,所以是同一个地址值
        System.out.println(s2 == s3);//false,都在堆中常量池,但是内容不同,所以指向两个地址值

        /*Object类中equals()的默认实现是通过==来比较的
         * 但是,String类已经重写过了继承自Object中的equals()
         * 重写后,不再按照==比较,而是比较两个字符串的具体内容
         * 也就是说,不论创建方式,只要串的内容一致,equals()就返回true*/
        System.out.println(s1.equals(s2));//true
        System.out.println(s1.equals(s11));//true
        System.out.println(s2.equals(s3));//false
        System.out.println(s2.equals(s22));//true
    }
}
